package com.sas.service;

import com.sas.entity.Schedule;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 排班Service接口
 */
public interface ScheduleService {

    /**
     * 保存排班信息
     */
    Schedule save(Schedule schedule);

    /**
     * 根据ID查询排班信息
     */
    Optional<Schedule> findById(Long id);

    /**
     * 查询所有排班信息
     */
    List<Schedule> findAll();

    /**
     * 根据员工ID查询排班
     */
    List<Schedule> findByEmployeeId(Long employeeId);

    /**
     * 根据房间ID查询排班
     */
    List<Schedule> findByRoomId(Long roomId);

    /**
     * 根据日期查询排班
     */
    List<Schedule> findByScheduleDate(LocalDate scheduleDate);

    /**
     * 根据员工ID和日期范围查询排班
     */
    List<Schedule> findByEmployeeIdAndDateRange(Long employeeId, LocalDate startDate, LocalDate endDate);

    /**
     * 根据房间ID和日期范围查询排班
     */
    List<Schedule> findByRoomIdAndDateRange(Long roomId, LocalDate startDate, LocalDate endDate);

    /**
     * 更新排班信息
     */
    Schedule update(Schedule schedule);

    /**
     * 删除排班信息
     */
    void deleteById(Long id);

    /**
     * 自动排班算法
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 排班结果
     */
    Map<String, Object> autoSchedule(LocalDate startDate, LocalDate endDate);

    /**
     * 检查排班冲突
     * @param schedule 排班信息
     * @return 是否有冲突
     */
    boolean hasScheduleConflict(Schedule schedule);

    /**
     * 获取员工排班表视图
     * @param employeeId 员工ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 排班表数据
     */
    Map<String, Object> getEmployeeScheduleView(Long employeeId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取管理员排班表视图
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 排班表数据
     */
    Map<String, Object> getAdminScheduleView(LocalDate startDate, LocalDate endDate);

    /**
     * 获取排班统计信息
     */
    Map<String, Object> getScheduleStatistics(LocalDate startDate, LocalDate endDate);
}